Slide source from 한빛미디어
1© Sungkyunkwan University (SKKU). All rights reserved.
보안 관리 측면에서 커널 레벨 서버의 필요성과 활용
Reagan Koo (reagan9@skku.edu)
Department of Computer Education
Sungkyunkwan University (SKKU)
2© Sungkyunkwan University (SKKU). All rights reserved.
3© Sungkyunkwan University (SKKU). All rights reserved.
커널 채팅의 목적
해커들의 시스템 침입 이후 해야 1순위 : 로그 삭제 / 위조
로그 삭제시 발생하는
1. 침입 사실 적발
2. 다시 침입 불가능
5© Sungkyunkwan University (SKKU). All rights reserved.
Kernel - Level?
User level chatKernel level chat 차이점
커널 채팅의 목적
비교 Kernel level User level
접근 권한 high low
복잡성 high low
성능 high low
범용성 low high
해커들은 서버에 침입한 보안 시스템 관련 로그를 제거하여 자신들의 흔적을
남기지 않으려고 한다. 이로 인해 사용자와 관리자는 서버에서 발생한 행위를
파악하기가 어려워지며, 향후 침입의 위험성도 증가하게 된다.
커널 채팅의 목적
커널은 하드웨어 리소스와 시스템 상태에 직접 접근할 있는 권한을 가지고
있다.커널 레벨의 소켓 서버를 사용하면 커널이 접근 가능한 특정 데이터에
접근할 있어 해킹과 보안 관점에서 중요한 역할을 있다.
커널 채팅의 목적
커널 레벨의 TCP 서버를 사용하면 시스템 로그를 외부 시스템에 저장하고
보관할 있어 해킹으로 인한 피해를 최소화할 있다.
커널 레벨의 TCP 서버를 사용하면 시스템 관리 측면에서도 서버에
직접적으로 접근할 없는 비정상적인 종료나 이상 상태가 발생해도
원격으로 로그를 저장하므로 오류를 쉽게 파악할 있다.
커널 채팅의 목적
시스템 로그를 커널 레벨에서 수집하고 보관하는 행위는 서버의 보안을 강화하고
시스템 상태를 모니터링하는 도움이 된다.
하지만 이러한 접근 방식은 커널 레벨에서의 데이터 접근과 TCP 서버 자체가
해킹이 된다면 서버의 중요한 로그가 해커에게 전달될 있기에 결점이 수도
있다.
따라서 적절한 보안 대책과 접근 제어 메커니즘을 통해 이를 예방하는 또한
매우 중요하다. 이에 특정 ip 허용하는 메커니즘 클라이언트의 파일 요청을
받아 파일(시스템 로그) 송신하는 코드, 채팅을 가능하게 하는 코드를 구현해
.
커널 채팅의 목적
10 © Sungkyunkwan University (SKKU). All rights reserved.
네트워크 스택
네트워크 스택은 크게 유저(user) 영역, 커널(kernel) 영역,
디바이스로(device) 영역으로 나눌 있다.
유저 영역과 커널 영역에서의 작업은 CPU수행한다.
유저 영역과 커널 영역은 디바이스 영역과 구별하기 위해
호스트(host)라고 부른다.
11 © Sungkyunkwan University (SKKU). All rights reserved.
애플리케이션은 write 시스템 콜을 호출하여 데이터를 보냄. (이때 소켓(fd)
이미 생성 연결되어 있다고 가정).
시스템 콜을 호출하면 제어권이 커널 영역으로 전환.
Linux 에서는 소켓이 파일의 종류로 다루어지기에 파일 레이어는 단순히
검사만 하고, 파일 구조체에 연결된 소켓 구조체를 사용하여 소켓 함수를 호출.
커널 소켓은 데이터를 순서대로 전송하기 위해 송신용(send) 수신용
(receive) 개의 버퍼를 가지고 있다. Write 시스템 콜을 호출하면 유저 영역
데이터가 커널 메모리로 복사되고, 송신용 소켓 버퍼(send socket buffer)
뒷부분에 추가된다.
이후 TCP 호출.
12
커널 채팅 구현
MAX_FILENAME_LEN: 전송할 파일의 최대 경로
이름 길이를 나타낸다.
MAX_MESSAGE_LEN: 전송할 메시지의 최대 길이를
나타낸다.
MAX_IP_LEN: IP길이의 최대값을 지정한다.
port: 서버가 사용할 포트 번호를 나타내는 변수이다.
server_socket: 서버 인터 ,
NULL 초기 설정하였다.
client_socket: 클라이언트 소켓을 가리키는 포인터 변수
, NULL 초기 설정하였다.
t c p _ s o c k e t _ e x i t 서버 소켓과
TC P 소켓을
종료한다.
s e r v e r _ s o c k e t 유효한
sock_release 함수 호출하여 서버
해제한다.
s e r v e r _ s o c k e t N U L L 설정한다.
마찬가지로 client_socket 유효한 우에도
동일한 과정을 수행한다..
코드 설명
서버 코드
https://github.com/reagan99/LinuxTerm
Prj/blob/filetransfer/chat2/chatserver.c
13
커널 채팅 구현
함수 create_server_socket 주어진 포트 번호에 서버 소켓을
생성하고,해당 소켓을 지정된 포트에 바인딩하며,연결 요청을
받을 있도록 리스닝 상태로 설정하는 역할을 한다.
함수는 다음과 같이 동작한다.
1. sock_create_kern 함수를 사용하여 커널 내부에서 서버
소켓을 생성하고,생성된 소켓은 server_socket 변수에
장된다.
2. memset 함수를 사용하여 addr 변수를 초기화한다.
3. addr 필드 값을 정하여 소켓 주소 조체를 초기화한
. AF_INETIPv4 주소 ,
htons 함수를 사용하 포트 번호를 네트워크 바이트 순서
변환한다.
4. kernel_bind 함수를 사용하여 서버 소켓을 addr 바인딩
한다. sizeof(struct sockaddr_in) 소켓 주소 구조체의
기를 나타낸다.
5. kernel_listen 함수를 사용하여 서버 소켓을 리스닝 상태
설정한다.
6. 서버 소켓이 성공적으로 생성,바인딩 스닝 되었음을
로그로 출력한다.
코드 설명
서버 코드
14
커널 채팅 구현
코드 설명
서버 코드 receive_message 함수는 주어진 소켓으로부터 메시지를
수신하고, 수신된 메시지를 지정된 버퍼에 저장하며, 수신된
메시지를 로그에 출력한다.
함수는 다음과 같이 동작한다.
1. 수신할 메시지를 저장할 struct msghdr 객체인 msg
초기화한다.
2. 수신된 메시지를 저장할 struct kvec 객체인 iov 초기화한다.
3. 수신된 메시지를 버퍼에 저장할 struct iov_iter 객체인 iter
초기화한다.
4. iov 객체에 버퍼와 버퍼의 크기를 설정한다.
5. msg 객체의 필드를 설정한다.
6. iov_iter_kvec 함수를 사용하여 iter 객체를 초기화한다.
7. kernel_recvmsg 함수를 사용하여 소켓으로부터 메시지를
수신하고, 수신된 바이트 수를 bytes_received저장한다.
8-1. 수신이 실패한 경우, 에러를 로그에 출력하고 -1반환한다.
8-2. 수신된 메시지를 로그에 출력한다.
9. 수신된 바이트 수를 반환한다.
15
커널 채팅 구현
코드 설명
서버 코드
send_message 함수는 주어진 소켓으로 메시지를
전송하는 역할을 수행한다.
함수는 다음과 같이 동작한다.
1. 함수 내부에서는 주어진 메시지를 socket으로
전송하기 위해 필요한 데이터 구조를 설정하고,
실제 전송 작업을 수행한다.
2. 메시지를 전송하기 위해 kvec 구조체를 사용하여
전송할 데이터를 설정하고, msghdr 구조체를
초기화하여 메시지 속성을 설정한다.
3. kernel_sendmsg 함수를 호출하여 소켓을 통해
메시지를 전송한다.
4. 전송이 성공하면 전송된 바이트 수를 반환하고,
실패하면 오류 코드를 반환한다.
16
커널 채팅 구현
코드 설명
서버 코드 send_file 함수는 주어진 파일을 소켓을 통해
클라이언트로 전송하는 역할을 한다.
1. 함수는 다음과 같이 동작한다.
2. 함수 내부에서는 주어진 파일을 열고, 읽은
데이터를 소켓으로 전송한다.
3. 파일을 열기 위해 filp_open 함수를 사용하고,
데이터를 임시로 저장할 버퍼를 할당하기 위해
kmalloc 함수를 사용한다.
4. 파일을 읽는 동안 kernel_read 함수를 호출하여
데이터를 읽는다.
5. send_message 함수를 사용하여 소켓으로
데이터를 전송한다.
6. 전송이 성공하면 전송된 바이트 수를 반환하고,
실패하면 오류 코드를 반환한다.
7. 함수가 종료되면 할당된 버퍼를 해제하고 파일을
닫는다.
17
커널 채팅 구현
코드 설명
서버 코드
SYSCALL_DEFINE2(server, const char __user *,
message, const char __user *, client_ip_arg)
서버 역할을 수행하는 시스템 호출 함수이다.클라이언트의
연결을 수락하고,메시지를 주고받으며,파일을 전송하는
역할을 수행한다.
1. 함수 내부에서 create_server_socket 함수를 호출하여 서버
켓을 생성한다.생성에 실패하면 오류 코드를 반환하고 함수를
종료한다.
2. ,무한 루프를 실행하여 클라이언트의 연결을 수락하고,
시지를 주고받으며,파일을 전송한다.
3. 루프 반복에서는 kernel_accept 함수 사용하여 클라이언
트의 연결을 수락한다.연결 수락에 실패하면 오류 코드를 반환
하고 루프를 종료한다.
4. 수락한 클라이언트의 ip주소가 커널에서 허용하기로 ip
치한다면 접속을 유지하고,아니라면 연결을 종료한다.
18
커널 채팅 구현
코드 설명
서버 코드
5. 수락된 클라이언트와 메시지를 수신하고,사용자 공간에서 작성
메시지를 커널로 메시지를 복사한뒤, send_message 함수를 사용하
클라이언트에게 전송한다.
6. 수신된 메시지가 "FILE:" 시작하는 경우,해당 메시지는 파일
청을 의미하며,파일명을 추출하여 send_file 함수를 호출하여 파일
전송한다.파일 전송에 실패하면 오류 메시지를 출력하고 루프를
종료한다.
7. 파일 전송이 이루어진 메시지로 클라이언트에게 "Hello,
client!" 메시지를 전송한다.
8. 루프 반복 후에는 클라이언트 소켓을 해제한다
9. tcp_socket_exit 함수를 호출하여 서버 소켓을 종료한다.
커널 채팅 구현
코드 설명
실행 결과
Ip 불일치로 연결 차단
메시지 교환
커널 채팅 구현
코드 설명
실행 결과
파일 전송
21 © Sungkyunkwan University (SKKU). All rights reserved.
결론적으로,커널 레벨의 TCP 버는 시스템 그를 커널에서 수집하고 보관하여
버의 보안을 강화하고 시스템 상태를 모니터링하는 도움을 있다.
그러나 이러한 접근 방식은 커널 레벨에서의 데이터 접근과 TCP 서버 체가 해킹당
한다면,중요한 로그가 해커에게 전달될 있기 때문에 위험할 있다.
따라서 적절한 보안 대책과 접근 제어 커니즘을 구현하여 이러한 험을 예방해야
한다.특정 IP 허용하는 메커니즘과 클라이언트의 파일 요청을 받아 파일을 신하
기능,채팅을 가능하게 하는 코드를 구현했다.이를 통해 보안 파일 전송,채팅
기능을 제공하는 TCP 서버를 구현했다.
커널 레벨의 TCP 서버는 안과 시스템 니터링 측면에서 중요한 역할을 있으
,적절한 보안 대책과 접근 제어를 구현하여 해킹으로부터의 위험을 소화해,서버
안정성과 보안성을 강화할 있다.
03. 결론
감사합니다